package cn.tedu.carehome.foundation.service.impl;

import cn.tedu.carehome.foundation.ex.ServiceException;
import cn.tedu.carehome.foundation.mapper.OlderMapper;
import cn.tedu.carehome.foundation.mapper.VisitorMapper;
import cn.tedu.carehome.foundation.pojo.dto.VisitorAddNewDTO;
import cn.tedu.carehome.foundation.pojo.dto.VisitorUpdateDTO;
import cn.tedu.carehome.foundation.pojo.entity.Older;
import cn.tedu.carehome.foundation.pojo.entity.Visitor;
import cn.tedu.carehome.foundation.pojo.vo.OlderStandardVO;
import cn.tedu.carehome.foundation.pojo.vo.VisitorListItemVO;
import cn.tedu.carehome.foundation.pojo.vo.VisitorStandardVO;
import cn.tedu.carehome.foundation.repo.IVisitorRedisRepository;
import cn.tedu.carehome.foundation.service.IVisitorService;
import cn.tedu.carehome.foundation.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 出来来访人员信息业务类
 * @author 张子豪
 * @version 0.0.1
 */
@Service
@Slf4j
public class VisitorServiceImpl implements IVisitorService {

    @Autowired
     private VisitorMapper visitorMapper;
    @Autowired
    private OlderMapper olderMapper;
    @Autowired
    private IVisitorRedisRepository iVisitorRedisRepository;
    //添加来访人员的业务方法
    @Override
    public void addNew(VisitorAddNewDTO visitorAddNewDTO) {
        log.debug("开始处理添加来访人员信息的业务:{}",visitorAddNewDTO);
        //调用olderMapper的getStandardById()执行查询
        OlderStandardVO standardById = olderMapper.getStandardById(visitorAddNewDTO.getOldId());
        //判断查询结果是否为NULL
        if (standardById==null){
            //是：抛出异常
            String message="添加来访人员信息失败，尝试拜访的老人不再本院居住";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        //创建visitor实体类对象
        Visitor visitor=new Visitor();
        //调用BeanUtils的copyProperties方法将visitorAddNewDTO拷贝到visitor对象中
        BeanUtils.copyProperties(visitorAddNewDTO,visitor);
        Integer rows = visitorMapper.insert(visitor);

        if (rows!=1){
            String message="添加来访人员信息失败，服务器忙请稍候尝试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }
    }
    //删除来访人员的业务方法
    @Override
    public void deleteById(Long id) {
        log.debug("开始处理通过Id删除来访人员信息的业务");
        //调用Mapper的getStandardById()执行查询
        VisitorStandardVO visitorStandardVO = visitorMapper.getStandardById(id);
        //判断查询结果是否为Null
        if (visitorStandardVO==null){
            //是：抛出异常
            String message="删除来访人员信息失败,尝试删除的来访人员数据不存在";
            log.debug(message);
            throw  new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        Integer rows = visitorMapper.deleteById(id);
        if (rows!=1){
            String message="删除来访人员信息失败，服务器忙请稍候尝试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
    }
    //批量删除来访人员的业务方法
    @Override
    public void deleteByIds(Long[] ids) {
        log.debug("开始处理通过Id数组批量删除来访人员的业务");
        //判断传入的数组是否为空
        if (ids.length<1){
            //是：抛出异常
            String message="批量删除失败，请勾选需要删除的访问人员";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        Integer rows = visitorMapper.deleteBYIds(ids);
        if (rows<1){
            String message="批量删除失败，服务器忙请稍后尝试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
    }
    //修改来访人员的业务方法
    @Override
    public void UpdateInfoById(Long id, VisitorUpdateDTO visitorUpdateDTO) {
        log.debug("开始处理通过来访人员的Id修改来访人员信息的业务");
        //调用visitorMapper的getStandardById()方法执行查询
        VisitorStandardVO standardById = visitorMapper.getStandardById(id);
        //判断查询结果是否为NULL
        if (standardById==null){
            //是：抛出异常
            String message="修改来访人员信息失败，尝试修改的来访人员信息不存在";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        //创建visitor实例对象
        Visitor visitor=new Visitor();
        BeanUtils.copyProperties(visitorUpdateDTO,visitor);
        visitor.setId(id);
        Integer rows = visitorMapper. UpdateInfo(visitor);
        if (rows!=1){
            String message="修改来访人员信息失败，服务器忙请稍候尝试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }
    }

    @Override
    public Integer count(Long oldId) {
        Integer count=visitorMapper.count(oldId);
        return count;
    }

    //查询来访人员详情的业务方法
    @Override
    public VisitorStandardVO selectById(Long id) {
        log.debug("开始处理通过来访人员ID获取来访人员详细信息的方法");
       //调用visitorMapper的getStandardById()方法执行查询
        VisitorStandardVO standardById = visitorMapper.getStandardById(id);
        //判断查询结果是为NULL
        if (standardById==null){
            //是：抛出异常
            String message="查询来访人员信息失败，尝试查询的信息不存在";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        return standardById;
    }
    //查询来访人员列表的业务方法
    @Override
    public List<VisitorListItemVO> list(Integer page, Integer size) {
        log.debug("开始处理通过老人Id查询来访人员列表的业务");
        //调用visitorMapper的getStandardById()方法执行查询

        //判断查询结果是为NULL

        page=(page-1)*size;
        List<VisitorListItemVO> list=visitorMapper.select( page, size);
        return list;
    }



    @Override
    public  void  rebuildCache(Integer page, Integer size) {
        log.debug("开始处理【重建访问人员缓存】的业务，无参数");
        iVisitorRedisRepository.deleteAll();
        page=(page-1)*size;
        List<VisitorListItemVO> list=visitorMapper.select(page,size);
        iVisitorRedisRepository.save(list);
        for (VisitorListItemVO vo:list){
            Long visitorId=vo.getId();
            VisitorStandardVO visitorStandardVO=visitorMapper.getStandardById(visitorId);
            iVisitorRedisRepository.save(visitorStandardVO);


        }
    }
}
